package com.xianniu.ltc.aspect;

import cn.devezhao.persist4j.Entity;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.rebuild.core.configuration.general.FormsBuilder;
import com.rebuild.core.metadata.MetadataHelper;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
/**
 * @author wangruijie
 * 实体新增/修改保存触发切面操作
 *
 */
@Slf4j
@Aspect
@Component
public class FormModelAfterAspect {

    //拦截指定的方法:拦截form-model和view-model 对于存在"新增明细"的模块中的数据进行处理
    @Pointcut("execution(public * com.rebuild.web.general.GeneralModelController.entityForm(..)) || " +
            "execution(public * com.rebuild.web.general.GeneralModelController.entityView(..))")
    public void excuteService() {}

    @AfterReturning(returning = "ret",pointcut = "excuteService()")
    public void doAfterReturning(Object ret) throws Throwable {
        log.info("拦截form-model和view-model切面------->FormModelAfterAspect开始");
        JSONObject jsonObject = (JSONObject) ret;
        // 返回字段带有lastModified 说明是编辑操作，点击新建不处理
        if (jsonObject.get("lastModified") != null){
            // 实体名称
            String entity = jsonObject.getString("entity");
            final Entity entityMeta = MetadataHelper.getEntity(entity);
            JSONArray elements = jsonObject.getJSONArray("elements");
            for (Object o: elements) {
                JSONObject jo = (JSONObject) o;
                // 获取返回值中的可重复文本进行再次赋值处理
                if (jo.getString("field").equalsIgnoreCase("kechongfuwenben")){
                    JSONArray elements2 = jo.getJSONArray("value");
                    if (elements2 == null){
                        jo.put("value", new JSONArray());
                        log.info("对于可添加明细的字段，获取返回值中的可重复文本为空，不进行处理------->FormModelAfterAspect结束");
                        return;
                    }
                    log.info("对于可添加明细的字段，获取返回值中的可重复文本进行再次赋值处理------->FormModelAfterAspect结束");
                    FormsBuilder.instance.buildElementsAspect(elements2, entityMeta);
                    jo.put("value", elements2);
                    return;
                }
            }
        }
        log.info("返回字段不带lastModified，不执行处理------->FormModelAfterAspect结束");
    }
}